home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / mig / Mig_GetAllInfo.c < prev    next >
C/C++ Source or Header  |  1990-06-22  |  4KB  |  136 lines

  1. /* 
  2.  * Mig_GetAllInfo.c --
  3.  *
  4.  *    Get info about one or more hosts from the global daemon.
  5.  *
  6.  * Copyright 1990 Regents of the University of California
  7.  * Permission to use, copy, modify, and distribute this
  8.  * software and its documentation for any purpose and without
  9.  * fee is hereby granted, provided that the above copyright
  10.  * notice appear in all copies.  The University of California
  11.  * makes no representations about the suitability of this
  12.  * software for any purpose.  It is provided "as is" without
  13.  * express or implied warranty.
  14.  */
  15.  
  16. #ifndef lint
  17. static char rcsid[] = "$Header: /sprite/src/lib/c/mig/RCS/Mig_GetAllInfo.c,v 2.1 90/06/22 14:58:21 douglis Exp $ SPRITE (Berkeley)";
  18. #endif not lint
  19.  
  20.  
  21. #include <sprite.h>
  22. #include <stdio.h>
  23. #include <mig.h>
  24. #include <kernel/net.h>
  25. #include <errno.h>
  26.  
  27. extern int errno;
  28. extern char *strerror();
  29. extern char *malloc();
  30.  
  31. /*
  32.  * The maximum number of records we transfer in a single ioctl.
  33.  */
  34. #define MAX_RECS 20
  35.  
  36. /*
  37.  *----------------------------------------------------------------------
  38.  *
  39.  * Mig_GetAllInfo --
  40.  *
  41.  *    Get the records for all hosts, up to the number of hosts specified.
  42.  *
  43.  * Results:
  44.  *    The number of valid records found is returned, and the data are
  45.  *    placed in *infoPtr.  Upon error, -1 is returned.
  46.  *
  47.  * Side effects:
  48.  *    The global daemon is contacted if it has not been already.
  49.  *
  50.  *----------------------------------------------------------------------
  51.  */
  52. int
  53. Mig_GetAllInfo(infoPtr, numRecs)
  54.     Mig_Info *infoPtr;        /* Pointer to array of structures */
  55.     int numRecs;        /* number of structures in *infoPtr */
  56. {
  57.     Mig_InfoRequest request;
  58.     static int init = 0;    /* Initialized? */
  59.     static char *buffer;     /* Dynamically-allocated buffer for result
  60.                    of ioctl. */
  61.     static unsigned int bufSize;/* Size of buffer. */
  62.     int status;            /* Status of system calls. */
  63.     int maxRecs = MAX_RECS;    /* Maximum number of recs in one ioctl. */
  64.     int obtained;        /* Number obtained thus far. */
  65.     int got;            /* Number obtained in one iteration. */
  66.     int nextHost;        /* Next entry to look for. */
  67.     int retry = 1;        /* Whether to retry after failed ioctl. */
  68.  
  69.  
  70.     if (mig_GlobalPdev < 0) {
  71.     if (MigOpenPdev(TRUE) < 0) {
  72.         return(-1);
  73.     }
  74.     }
  75.  
  76.     if (!init) {
  77.     init = 1;
  78.     bufSize = 2 * sizeof(int) +  maxRecs * sizeof(Mig_Info);
  79.     buffer = malloc(bufSize);
  80.     if (buffer == (char *) NULL) {
  81.         errno = ENOMEM;
  82.         init = 0;
  83.         return(-1);
  84.     }
  85.     }
  86.     nextHost = 1;
  87.  
  88.     for (obtained = 0; obtained < numRecs;) {
  89.     request.numRecs = maxRecs;
  90.     request.firstHost = nextHost;
  91.  
  92.     if (MigSetAlarm() < 0) {
  93.         fprintf(stderr,
  94.             "Error setting alarm for contact with migd.\n");
  95.         return(-1);
  96.     }
  97.     status = Fs_IOControl(mig_GlobalPdev, IOC_MIG_GETINFO,
  98.                   sizeof(Mig_InfoRequest),
  99.                   (char *) &request,
  100.                   bufSize, buffer);
  101.     if (MigClearAlarm() < 0) {
  102.         fprintf(stderr,
  103.             "Error clearing alarm for contact with migd.\n");
  104.     }
  105.     if (status != SUCCESS) {
  106.         close(mig_GlobalPdev);
  107.         mig_GlobalPdev = 0;
  108.         if (retry == 0 || MigOpenPdev(TRUE) < 0) {
  109.         fprintf(stderr,
  110.                "Mig_GetAllInfo: error during ioctl to global master: %s\n",
  111.                Stat_GetMsg(status));
  112.         errno = Compat_MapCode(status);
  113.         return(-1);
  114.         }
  115.         retry = 0;
  116.         continue;
  117.     }
  118.     retry = 1;
  119.     got = *((int *) buffer);
  120.     if (got == 0) {
  121.         break;
  122.     }
  123.     obtained += got;
  124.     bcopy(buffer + 2 * sizeof(int), (char *) infoPtr,
  125.           got * sizeof(Mig_Info));
  126.     if (got < maxRecs) {
  127.         break;
  128.     }
  129.     nextHost = infoPtr[got-1].hostID + 1;
  130.     infoPtr += got;
  131.     }
  132.     
  133.     return(obtained);
  134.     
  135. }
  136.